library(tidyverse)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
Registered S3 methods overwritten by 'ggplot2':
  method         from 
  [.quosures     rlang
  c.quosures     rlang
  print.quosures rlang
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v ggplot2 3.1.1     v purrr   0.3.2
v tibble  2.1.2     v dplyr   0.8.1
v tidyr   0.8.3     v stringr 1.4.0
v readr   1.3.1     v forcats 0.4.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
source("calc_footprint_FFP.R")
library(ggplot2)
library(modelr)
options(na.action = na.warn)

Lists

rm(list=ls())

Defining the data I/O directory for the Eddy Master File

**

path_eddy<-"C:\\Users\\Tommy\\flux\\Data-exploring\\02_Concord\\"
path.in_eddy<-paste(path_eddy,"01_Proccessed_Data",sep="")
path.out_eddy<-paste(path_eddy,"03_combined_data",sep="")
ver<-"Master_Eddy" 
file.name_eddy<-paste("master_eddy_pro_concord",sep="")

read in eddypro full output Master file, parse variable names

data_master_eddy<-read.csv(paste(path.in_eddy,"\\",ver,"\\",file.name_eddy,".csv",sep=""),
                  header=F,
                  skip=3,
                  na.strings=c(-9999),
                  stringsAsFactors = F)
colnames(data_master_eddy)<-colnames(
  read.csv(paste(path.in_eddy,"\\",ver,"\\",file.name_eddy,".csv",sep=""),
           header=T,
           skip=1))

data_master_eddy

Defining the data I/O directory for the Master met_data

path_met<-"C:\\Users\\Tommy\\flux\\Data-exploring\\02_Concord\\"
path.in_met<-paste(path_met,"01_Proccessed_Data",sep="")
path.out_met<-paste(path_met,"03_combined_data",sep="")
ver<-"met_data" 
file.name<-paste("MET_data_master",sep="")

#read in Met_Data Master file, parse variable names and define N/As#

met_data_master<-read.csv(paste(path.in_met,"\\",ver,"\\",file.name,".csv",sep=""),
                  header=F,
                  skip=4,
                  na.strings=c("NAN"),
                  stringsAsFactors = F)
colnames(met_data_master)<-colnames(
  read.csv(paste(path.in_met,"\\",ver,"\\",file.name,".csv",sep=""),
           header=T,
           skip= 1))

met_data_master
NA

Parsing the time stamp converting it into a POSIXlt vector

interpreting date and time into new timestamp column

Then taking that time stamp column and turning each time into a unique number (time.id) so I can join based on that. As it can be really tricky to join/merge based on time stamps alone

Or I could make sure both time stamps are characters and match them that way

Finally ploting time.id to make sure my times translate linearily

data_master_eddy$TIMESTAMP<-strptime(paste(data_master_eddy$date,data_master_eddy$time,sep=" "),format="%m/%d/%Y %H:%M", tz = "GMT")

data_master_eddy$time.id<-data_master_eddy$TIMESTAMP$year+1900+(data_master_eddy$TIMESTAMP$yday)/366+(data_master_eddy$TIMESTAMP$hour)/366/24+ (data_master_eddy$TIMESTAMP$min)/366/24/60

data_master_eddy$time.id[1:50]
 [1] 2019.450 2019.450 2019.450 2019.450 2019.450 2019.450 2019.450 2019.450 2019.451
[10] 2019.451 2019.451 2019.451 2019.451 2019.451 2019.451 2019.451 2019.451 2019.451
[19] 2019.451 2019.451 2019.451 2019.451 2019.451 2019.451 2019.451 2019.452 2019.452
[28] 2019.452 2019.452 2019.452 2019.452 2019.452 2019.452 2019.452 2019.452 2019.452
[37] 2019.452 2019.452 2019.452 2019.452 2019.452 2019.452 2019.452 2019.453 2019.453
[46] 2019.453 2019.453 2019.453 2019.453 2019.453
plot(data_master_eddy$time.id)

which(duplicated(data_master_eddy$time.id))
integer(0)

#Taking the met_data and turning the time stamp into posixt format#

met_data_master$TIMESTAMP<-strptime(met_data_master$TIMESTAMP,
                           format ="%m/%d/%Y %H:%M", tz = "GMT")

met_data_master$TIMESTAMP[1:20]
 [1] "2019-06-25 09:00:00 GMT" "2019-06-25 09:30:00 GMT" "2019-06-25 10:00:00 GMT"
 [4] "2019-06-25 10:30:00 GMT" "2019-06-25 11:00:00 GMT" "2019-06-25 11:30:00 GMT"
 [7] "2019-06-25 12:00:00 GMT" "2019-06-25 12:30:00 GMT" "2019-06-25 13:00:00 GMT"
[10] "2019-06-25 13:30:00 GMT" "2019-06-25 14:00:00 GMT" "2019-06-25 14:30:00 GMT"
[13] "2019-06-25 15:00:00 GMT" "2019-06-25 15:30:00 GMT" "2019-06-25 16:00:00 GMT"
[16] "2019-06-25 16:30:00 GMT" "2019-06-25 17:00:00 GMT" "2019-06-25 17:30:00 GMT"
[19] "2019-06-25 18:00:00 GMT" "2019-06-25 18:30:00 GMT"

#Making sure timestamp columns line up#


met_data_master$TIMESTAMP[1:10]
 [1] "2019-06-25 09:00:00 GMT" "2019-06-25 09:30:00 GMT" "2019-06-25 10:00:00 GMT"
 [4] "2019-06-25 10:30:00 GMT" "2019-06-25 11:00:00 GMT" "2019-06-25 11:30:00 GMT"
 [7] "2019-06-25 12:00:00 GMT" "2019-06-25 12:30:00 GMT" "2019-06-25 13:00:00 GMT"
[10] "2019-06-25 13:30:00 GMT"
data_master_eddy$TIMESTAMP[1:10]
 [1] "2019-06-14 17:30:00 GMT" "2019-06-14 18:00:00 GMT" "2019-06-14 18:30:00 GMT"
 [4] "2019-06-14 19:00:00 GMT" "2019-06-14 19:30:00 GMT" "2019-06-14 20:00:00 GMT"
 [7] "2019-06-14 20:30:00 GMT" "2019-06-14 21:00:00 GMT" "2019-06-14 21:30:00 GMT"
[10] "2019-06-14 22:00:00 GMT"
met_data_master

#creating a time id for the MET Data so I I can join the MET and Eddy Pro Data#


met_data_master$time.id <-met_data_master$TIMESTAMP$year+1900+(met_data_master$TIMESTAMP$yday)/366+(met_data_master$TIMESTAMP$hour)/366/24 + (met_data_master$TIMESTAMP$min)/366/24/60 

met_data_master$time.id[1:20]
 [1] 2019.479 2019.479 2019.479 2019.479 2019.479 2019.479 2019.480 2019.480 2019.480
[10] 2019.480 2019.480 2019.480 2019.480 2019.480 2019.480 2019.480 2019.480 2019.480
[19] 2019.480 2019.480
plot(met_data_master$time.id)

which(duplicated(met_data_master$time.id))
integer(0)
met_data_master

#Joining the Met_Data and Eddy Pro Data Sets#

with merge


combo_master_ed_met<- merge(met_data_master[,-which(colnames(met_data_master)=="TIMESTAMP")], data_master_eddy[,-which(colnames(data_master_eddy)=="TIMESTAMP")], by = "time.id")

combo_master_ed_met

colnames(combo_master_ed_met)
  [1] "time.id"                       "RECORD"                       
  [3] "BattV_Avg"                     "PTemp_C_Avg"                  
  [5] "AM25T_ref_Avg"                 "TC_Avg.1."                    
  [7] "TC_Avg.2."                     "TC_Avg.3."                    
  [9] "TC_Avg.4."                     "TC_Avg.5."                    
 [11] "TC_Avg.6."                     "TC_Avg.7."                    
 [13] "TC_Avg.8."                     "TC_Avg.9."                    
 [15] "TC_Avg.10."                    "TC_Avg.11."                   
 [17] "TC_Avg.12."                    "TC_Avg.13."                   
 [19] "TC_Avg.14."                    "TC_Avg.15."                   
 [21] "TC_Avg.16."                    "TC_Avg.17."                   
 [23] "TC_Avg.18."                    "TC_Avg.19."                   
 [25] "TC_Avg.20."                    "TC_Avg.21."                   
 [27] "TC_Avg.22."                    "TC_Avg.23."                   
 [29] "TC_Avg.24."                    "TC_Avg.25."                   
 [31] "AirT_Avg"                      "RH_Avg"                       
 [33] "AtmPressure_Avg"               "NR_mV_Avg"                    
 [35] "NR_Wm2_Avg"                    "PAR_in_mV_Avg"                
 [37] "PAR_in_uEm2_Avg"               "PAR_out_mV_Avg"               
 [39] "PAR_out_uEm2_Avg"              "SHF_1_mV_Avg"                 
 [41] "SHF_1_Wm2_Avg"                 "SHF_2_mV_Avg"                 
 [43] "SHF_2_Wm2_Avg"                 "WaterP_Avg"                   
 [45] "WaterT_Avg"                    "Precip_mm_Tot"                
 [47] "VWC_Avg"                       "EC_Avg"                       
 [49] "T_Avg"                         "P_Avg"                        
 [51] "PA_Avg"                        "VR_Avg"                       
 [53] "filename"                      "date"                         
 [55] "time"                          "DOY"                          
 [57] "daytime"                       "file_records"                 
 [59] "used_records"                  "Tau"                          
 [61] "qc_Tau"                        "H"                            
 [63] "qc_H"                          "LE"                           
 [65] "qc_LE"                         "co2_flux"                     
 [67] "qc_co2_flux"                   "h2o_flux"                     
 [69] "qc_h2o_flux"                   "H_strg"                       
 [71] "LE_strg"                       "co2_strg"                     
 [73] "h2o_strg"                      "co2_v.adv"                    
 [75] "h2o_v.adv"                     "co2_molar_density"            
 [77] "co2_mole_fraction"             "co2_mixing_ratio"             
 [79] "co2_time_lag"                  "co2_def_timelag"              
 [81] "h2o_molar_density"             "h2o_mole_fraction"            
 [83] "h2o_mixing_ratio"              "h2o_time_lag"                 
 [85] "h2o_def_timelag"               "sonic_temperature"            
 [87] "air_temperature"               "air_pressure"                 
 [89] "air_density"                   "air_heat_capacity"            
 [91] "air_molar_volume"              "ET"                           
 [93] "water_vapor_density"           "e"                            
 [95] "es"                            "specific_humidity"            
 [97] "RH"                            "VPD"                          
 [99] "Tdew"                          "u_unrot"                      
[101] "v_unrot"                       "w_unrot"                      
[103] "u_rot"                         "v_rot"                        
[105] "w_rot"                         "wind_speed"                   
[107] "max_wind_speed"                "wind_dir"                     
[109] "yaw"                           "pitch"                        
[111] "roll"                          "u."                           
[113] "TKE"                           "L"                            
[115] "X.z.d..L"                      "bowen_ratio"                  
[117] "T."                            "model"                        
[119] "x_peak"                        "x_offset"                     
[121] "x_10."                         "x_30."                        
[123] "x_50."                         "x_70."                        
[125] "x_90."                         "un_Tau"                       
[127] "Tau_scf"                       "un_H"                         
[129] "H_scf"                         "un_LE"                        
[131] "LE_scf"                        "un_co2_flux"                  
[133] "co2_scf"                       "un_h2o_flux"                  
[135] "h2o_scf"                       "spikes_hf"                    
[137] "amplitude_resolution_hf"       "drop_out_hf"                  
[139] "absolute_limits_hf"            "skewness_kurtosis_hf"         
[141] "skewness_kurtosis_sf"          "discontinuities_hf"           
[143] "discontinuities_sf"            "timelag_hf"                   
[145] "timelag_sf"                    "attack_angle_hf"              
[147] "non_steady_wind_hf"            "u_spikes"                     
[149] "v_spikes"                      "w_spikes"                     
[151] "ts_spikes"                     "co2_spikes"                   
[153] "h2o_spikes"                    "chopper_LI.7500"              
[155] "detector_LI.7500"              "pll_LI.7500"                  
[157] "sync_LI.7500"                  "mean_value_RSSI_LI.7500"      
[159] "u_var"                         "v_var"                        
[161] "w_var"                         "ts_var"                       
[163] "co2_var"                       "h2o_var"                      
[165] "w.ts_cov"                      "w.co2_cov"                    
[167] "w.h2o_cov"                     "vin_sf_mean"                  
[169] "co2_mean"                      "h2o_mean"                     
[171] "dew_point_mean"                "co2_signal_strength_7500_mean"

#Add back time stamp to the combo_master_ed_met#

combo_master_ed_met$TIMESTAMP<-strptime(paste(combo_master_ed_met$date,combo_master_ed_met$time,sep=" "),format="%m/%d/%Y %H:%M", tz = "GMT")

combo_master_ed_met$TIMESTAMP[1:10]
 [1] "2019-06-25 09:00:00 GMT" "2019-06-25 09:30:00 GMT" "2019-06-25 10:00:00 GMT"
 [4] "2019-06-25 10:30:00 GMT" "2019-06-25 11:00:00 GMT" "2019-06-25 11:30:00 GMT"
 [7] "2019-06-25 12:00:00 GMT" "2019-06-25 12:30:00 GMT" "2019-06-25 13:00:00 GMT"
[10] "2019-06-25 13:30:00 GMT"
combo_master_ed_met
NA
NA
NA

#Creating a CSV File of my combine Master File!#

write.csv(combo_master_ed_met,
          paste(path.out_eddy,ver,"combo_master_ed_met",sep=""),
          quote = T,
          row.names = F)

#filtering data for quality control filters# filtering latent heat, sensible heat, co2 flux, qc_tau and h20flux by quality controls

combo_master_ed_met$LE.[!is.na(combo_master_ed_met$qc_LE)&combo_master_ed_met$qc_LE==2]<-NA

combo_master_ed_met$qqc_h2o_flux[!is.na(combo_master_ed_met$qc_h2o_flux)&combo_master_ed_met$qc_h2o_flux==2]<-NA

combo_master_ed_met$H[!is.na(combo_master_ed_met$qc_H)&combo_master_ed_met$qc_H==2]<-NA

combo_master_ed_met$u.[!is.na(combo_master_ed_met$qc_Tau)&combo_master_ed_met$qc_Tau==2]<-NA

combo_master_ed_met$co2_flux[!is.na(combo_master_ed_met$co2_flux)&combo_master_ed_met$co2_flux==2]<-NA

latent heat, sensible heat, h20_flux, and relative humidity by day for whole period


plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$LE)

hist(combo_master_ed_met$LE)


plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$h2o_flux)


plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$H)


plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$RH)

NA
NA
NA
NA
NA

#Half Hour Flux Averages

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$co2_flux,xlab='Time', ylab='Co2 Fluxes', main=' Half Hour Co2 Flux Averages',  ylim = c(-20,20),pch=1,col="blue",cex=0.4)

#Daily average of fluxes


plot(tapply(combo_master_ed_met$co2_flux ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)), xlab='Time', ylab='Co2 Fluxes', main='Daily Co2 Flux Averages',pch=1,col="red",cex=1.5)

#Plotting Co2 flux by timstamp on x-axis. First half-hourly data and daily data stacked

layout(matrix(c(1,1,2,2), 2, 2, byrow = TRUE))
plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$co2_flux, xlab='Time', ylab='Co2 Fluxes', main='Half Hour Flux Averages',  ylim = c(-15,15),pch=1,col="blue",cex=0.4)
plot(tapply(combo_master_ed_met$co2_flux ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)), xlab='Time', ylab='Co2 Fluxes', main='Daily Co2 Flux Averages',pch=1,col="red",cex=1.5)

NA
NA

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$co2_flux,
  ylim = c(-10, 10),
               cex=0.6,col="grey",
               xlab= 'Time', 
               ylab="", 
               main='',las=1,
               lpars=list(lwd=3,col="red"))
mtext(side=2,expression(CO[2]~Flux~'('~mu~mol~m^{-2}~s^{-1}~')'),line=2.5)
par(new= TRUE)
plot(tapply(combo_master_ed_met$co2_flux ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),
     xaxt='n', 
     xlab='Time', 
     ylab='', 
     main='', las =1,
     ylim = c(-10,10),
     lty=1,col="red",
     lwd=2,type="l")
mtext(side=2,expression(CO[2]~Flux~'('~mu~mol~m^{-2}~s^{-1}~')'),line=2.5)
abline(h=0,col="black")

#Plotting daily flux average over half hour fluxes



plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$co2_flux, 
     xlab='Time', 
     ylab='Co2 Fluxes', 
     main='',  ylim = c(-10,10),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$co2_flux ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Co2 Fluxes', main='',ylim = c(-10,10),lty=1,col="red",lwd=2,type="l")
abline(h=0,col="black")
legend(x='bottomright',legend=c('1/2 hour fluxes', 'daily flux averages'),
col=c('grey', 'red'), pch=c(1,19))

#Daily average of Sensible Heat

plot(tapply(combo_master_ed_met$H,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xlab='Time', ylab='Sensible Heat', main='Daily Average of Sensible Heat')

#Daily average of Latent Heat

plot(tapply(combo_master_ed_met$LE ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xlab='Time', ylab='Latent Heat', main='Daily Average of Latent Heat')

#line plot of c02_fluxes#

ggplot(data = combo_master_ed_met) + 
  geom_line(mapping = aes(x = time.id , y = co2_flux)) 

#latent heat and Sensible heat plotted over eachother

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$LE,xlab='Time', ylab='Latent and Sensible Heat', main='Latent and Sensible Heat',pch=1,col="blue",cex=0.6)
points(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$H,col="red",pch=1,cex=0.6)
legend(x='bottomright',legend=c('Latent Heat', 'Sensible Heat'),
col=c('blue', 'red'), pch=c(1,19))

#air temperatue by sensible heat an U* by co2 flux

plot(combo_master_ed_met$air_temperature-273.15,combo_master_ed_met$H,xlim=c(10,40),ylim=c(-100,500))




plot(combo_master_ed_met$u. ,combo_master_ed_met$co2_flux, ylim = c(0, 10), xlim = c(0,1))

#Adding best fit line to air temperature by sensible heat

ggplot(data = combo_master_ed_met) + 
  geom_point(mapping = aes(x = air_temperature-273.15, y = H)) +
  geom_smooth(mapping = aes(x = air_temperature-273.15, y = H))

NA
NA

#best fit line to U* bt co2 flux

ggplot(data = combo_master_ed_met) + 
  geom_point(mapping = aes(x = u., y = co2_flux)) +
  geom_smooth(mapping = aes(x = u., y = co2_flux))
library(tidyverse)
hist(combo_master_ed_met$wind_dir, xlim = c(0,370), breaks = 36, main = "Wind Direction at Concord Tower", xlab = 'Degrees')

#Comparing MET Temperature data to temperature reading from Licor intruments#

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$PTemp_C_Avg)
points(combo_master_ed_met$TIMESTAMP,combo_master_ed_met$air_temperature-273.15,col="red",pch=2)

#Adding coefficient to Net radiation#

combo_master_ed_met$Correct_NR = (combo_master_ed_met$NR_Wm2_Avg*10)/14.2

#plotting air temperature from data logger. see where our gaps line up. lines up with net radiation and gaps

plot(combo_master_ed_met$AirT_Avg)

#plotting Net Radation to see the bad data.

summary(combo_master_ed_met$Correct_NR[c(1:600,2500:4000)])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-106.27  -69.79  -17.23  121.53  339.30  644.37 
plot(combo_master_ed_met$Correct_NR)

#filtering out bad NR numbers


combo_master_ed_met$Correct_NR[!is.na(combo_master_ed_met$Correct_NR)&(combo_master_ed_met$Correct_NR<(-150)|combo_master_ed_met$Correct_NR>800)]<-NA
summary(combo_master_ed_met$Correct_NR)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-146.97  -67.96  -49.57   88.05  250.14  775.35    3106 
plot(combo_master_ed_met$Correct_NR)

summary(combo_master_ed_met$Correct_NR)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-146.97  -67.96  -49.57   88.05  250.14  775.35    3106 

#Adding coefficient to Soil Heat Flux Data

plot(combo_master_ed_met$SHF_1_mV_Avg,ylim=c(-10,10))

combo_master_ed_met$Correct_shf = (combo_master_ed_met$SHF_1_mV_Avg*16.455)
plot(combo_master_ed_met$Correct_shf,ylim=c(-50,50))

#plotting Soil heat flux to see the bad data.


summary(combo_master_ed_met$Correct_shf)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-18.759  -9.462  -4.690  -0.672   6.417  47.868    3814 
summary(combo_master_ed_met$Correct_shf[c(2500:4000)])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-14.349  -8.919  -3.538   1.246  10.877  33.206 
plot(combo_master_ed_met$Correct_shf)

plot(combo_master_ed_met$Correct_shf[c(2500:4000)], ylim = c(-50,50),xlab='8/14/2019 to 9/20/2019', ylab='Soil Heat Flux ', main='Half Hour Averages of Soil Heat Flux of the Concord Site')

#filtering out bad soil heat flux numbers


combo_master_ed_met$Correct_shf[!is.na(combo_master_ed_met$Correct_shf)&(combo_master_ed_met$Correct_shf<(-20)|combo_master_ed_met$Correct_shf>50)]<-NA
summary(combo_master_ed_met$Correct_shf)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-18.759  -9.462  -4.690  -0.672   6.417  47.868    3814 
plot(combo_master_ed_met$Correct_shf)

Energy Balance of non-gapfilled data. Slope of line is energy balance closure. Ideally it should be 1:1 Net radiation - soil heat flux= to Latent heat +sensible heat.



combo_master_ed_met$E_ng = (combo_master_ed_met$Correct_NR-combo_master_ed_met$Correct_shf)

summary(combo_master_ed_met$E_ng )
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-138.33  -60.82  -43.80   75.92  206.58  763.13    3901 
plot(combo_master_ed_met$E_ng)


combo_master_ed_met$E_le_and_H =(combo_master_ed_met$LE+combo_master_ed_met$H)
summary(combo_master_ed_met$E_le_and_H  )
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-514.86  -18.34    3.21   74.61  164.30  523.76     882 
plot(combo_master_ed_met$E_le_and_H )


scatter.smooth(combo_master_ed_met$E_ng, combo_master_ed_met$E_le_and_H )

lm(combo_master_ed_met$E_le_and_H  ~ combo_master_ed_met$E_ng)
Dropping 4195 rows with missing values

Call:
lm(formula = combo_master_ed_met$E_le_and_H ~ combo_master_ed_met$E_ng)

Coefficients:
             (Intercept)  combo_master_ed_met$E_ng  
                 16.9654                    0.5162  
summary(lm(combo_master_ed_met$E_le_and_H  ~ combo_master_ed_met$E_ng-1))
Dropping 4195 rows with missing values

Call:
lm(formula = combo_master_ed_met$E_le_and_H ~ combo_master_ed_met$E_ng - 
    1)

Residuals:
    Min      1Q  Median      3Q     Max 
-435.88    3.73   16.47   31.23  285.85 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
combo_master_ed_met$E_ng 0.546294   0.004323   126.4   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 50.35 on 2817 degrees of freedom
  (4195 observations deleted due to missingness)
Multiple R-squared:   0.85, Adjusted R-squared:   0.85 
F-statistic: 1.597e+04 on 1 and 2817 DF,  p-value: < 2.2e-16

#1/2 hour and daily averages of Latent Heat

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$LE, 
     xlab='Time', 
     ylab= expression(Latent~Heat~'('~W~m^{-2}~')'), 
     main='',  
     ylim = c(-40,300),
     pch=1,
     col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$LE ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),
     xaxt='n', 
     xlab='Time', 
    ylab= expression(Latent~Heat~'('~W~m^{-2}~')'),  
     main='',
     ylim = c(-40,300),lty=1,col="red",lwd=2,type="l")
abline(h=0,col="black")

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$LE,
  ylim = c(-40, 300),
               cex=0.4,col="grey",
               xlab= 'Time', 
               ylab="", 
               main='',las=1,
               lpars=list(lwd=3,col="red"))
mtext(side=2,expression(Latent~Heat~'('~W~m^{-2}~')'),line=2.5)
par(new= TRUE)
plot(tapply(combo_master_ed_met$LE ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),
     xaxt='n', 
     xlab='Time', 
     ylab='', 
     main='', las =1,
     ylim = c(-40,300),
     col="red",pch=1,cex=1.0)
mtext(side=2,expression(Latent~Heat~'('~W~m^{-2}~')'),line=2.5)
abline(h=0,col="black")
legend(x='topright',legend=c('1/2 hour averages', 'daily averages'),
col=c('grey', 'red'), pch=c(19,1))

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$LE, 
     xlab='Time', 
     ylab='Latent Heat', 
     main='Latent Heat: Daily and Half Hour Averages', 
     ylim = c(-40,300),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$LE ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n'
     , xlab='Time',
     ylab='Latent Heat', 
     main='Latent Heat: Daily and Half Hour Averages',
     ylim = c(-40,300),
     col="red",pch=1,cex=1.0)
abline(h=0,col="black")
legend(x='topright',legend=c('1/2 hour averages', 'daily averages'),
col=c('grey', 'red'), pch=c(1,1))

#1/2 hour and daily averages of Sensible Heat

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$H, xlab='Time', ylab='Sensible Heat', main='Sensible Heat: Daily and Half Hour Averages',  ylim = c(-40,300),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$H ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Sensible Heat', main='Sensible Heat: Daily and Half Hour Averages',ylim = c(-40,300),lty=1,col="red",lwd=2,type="l")
abline(h=0,col="black")

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$H, xlab='Time', ylab='Sensible Heat', main='Sensible Heat: Daily and Half Hour Averages',  ylim = c(-40,300),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$H ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Sensible Heat', main='Sensible Heat: Daily and Half Hour Averages',ylim = c(-40,300),col="red",pch=1,cex=1.0)
abline(h=0,col="black")

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$H,
  ylim = c(-40, 300),
               cex=0.4,col="grey",
               xlab= 'Time', 
               ylab="", 
               main='',las=1,
               lpars=list(lwd=3,col="red"))
mtext(side=2,expression(Sensible~Heat~'('~W~m^{-2}~')'),line=2.5)
par(new= TRUE)
plot(tapply(combo_master_ed_met$H ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),
     xaxt='n', 
     xlab='Time', 
     ylab='', 
     main='', las =1,
     ylim = c(-40,300),
     col="red",pch=1,cex=1.0)
mtext(side=2,expression(Sensible~Heat~'('~W~m^{-2}~')'),line=2.5)
abline(h=0,col="black")

#Net Radiation Daily and 1/2 hour averages

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$Correct_NR, xlab='Time', ylab='Net Radiation', main='Net Radiation: Daily and Half Hour Averages',  ylim = c(-80,800),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$Correct_NR ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Net Radiation', main='Net Radiation: Daily and Half Hour Averages',ylim = c(-80,800),lty=1,col="red",lwd=2,type="l")
abline(h=0,col="black")


plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$Correct_NR, xlab='Time', ylab='Net Radiation', main='Net Radiation: Daily and Half Hour Averages',  ylim = c(-80,800),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$Correct_NR ,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Net Radiation', main='Net Radiation: Daily and Half Hour Averages',ylim = c(-80,800),col="red",pch=1,cex=1.0)
abline(h=0,col="black")

#soil heat flux

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$Correct_shf, xlab='Time', ylab='Soil Heat Flux', main='Soil Heat Flux: Daily and Half Hour Averages',  ylim = c(-20,40),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$Correct_shf,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Soil Heat Flux', main='Soil Heat Flux: Daily and Half Hour Averages',ylim = c(-20,40),lty=1,col="red",lwd=2,type="l")
abline(h=0,col="black")

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$Correct_shf, xlab='Time', ylab='Soil Heat Flux', main='Soil Heat Flux: Daily and Half Hour Averages',  ylim = c(-20,40),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$Correct_shf,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Soil Heat Flux', main='Soil Heat Flux: Daily and Half Hour Averages',ylim = c(-20,40),col="red",pch=1,cex=1.0)
abline(h=0,col="black")

#air temperature daily and 1/2 hour averages

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$air_temperature-273.15, xlab='Time', ylab='Air Temperature C: Daily and 1/2 Hour Averages', main=' ',  ylim = c(5,40),pch=1,col="grey",cex=0.4)
par(new= TRUE)
plot(tapply(combo_master_ed_met$air_temperature-273.15,round(combo_master_ed_met$DOY),function(x) mean(x,na.rm=T)),xaxt='n', xlab='Time', ylab='Air Temperature C: Daily and 1/2 Hour Averages', main='',ylim = c(5,40),lty=1,col="red",lwd=2,type="l")
abline(h=0,col="black")

#Water Fluxes daily and 1/2 hour averages

plot(combo_master_ed_met$TIMESTAMP ,combo_master_ed_met$h2o_flux, xlab='Time', ylab='H2O Fluxes', main='H2O Fluxes: Daily and Half Hour Averages',  ylim = c(-2,5),pch=1,col="grey",cex=0.4)
par(new= TRUE)

plot(tapply(combo_master_ed_met$h2o_flux,
            round(combo_master_ed_met$DOY),
            function(x) mean(x,na.rm=T)),
     xaxt='n',
     xlab='Time',
     ylab='H2O Fluxes',
     main='H2O Fluxes: Daily and Half Hour Averages',
     ylim = c(-2,5),
     lty=1,
     col="red",
     lwd=2,
     type="l")
abline(h=0,col="black")


plot(cumsum(tapply(combo_master_ed_met$h2o_flux,
            round(combo_master_ed_met$DOY),
            function(x) mean(x,na.rm=T)))*18.02/1000000*1800*48,
     xaxt='n',
     xlab='Days since June 25',
     ylab=expression(Cumulative~Evapotranspiration~'('~mm~')'),
     main='',
     ylim = c(0,150),
     lty=1,
     col="red",
     lwd=2,
     type="l")
axis(side=1,at=seq(0,120,by=30))


plot(cumsum(tapply(combo_master_ed_met$co2_flux,
            round(combo_master_ed_met$DOY),
            function(x) mean(x,na.rm=T)))*12/1000000*1800*48,
     xaxt='n',
     xlab='Days since June 25',
     ylab=expression(Cumulative~NEE~'('~g~C~m^{-2}~')'),
     main='',
     ylim = c(-50,10),
     lty=1,
     col="red",
     lwd=2,
     type="l")
axis(side=1,at=seq(0,120,by=30))

#Co2 fluxes v.s u star, temperature, and VPD


plot(combo_master_ed_met$u. ,combo_master_ed_met$co2_flux, ylim = c(-5, 10), xlim = c(0,1), xlab='U*', ylab='Co2 Fluxes', main='Co2 Fluxes v.s U*')


plot(combo_master_ed_met$VPD ,combo_master_ed_met$co2_flux, ylim = c(-5, 10), xlab='VPD', ylab='Co2 Fluxes', main='Co2 Fluxes v.s VPD*')


plot(combo_master_ed_met$air_temperature-273.15 ,combo_master_ed_met$co2_flux, ylim = c(-5, 10), xlab='Air Temperature (C)', ylab='Co2 Fluxes', main='Co2 Fluxes v.s Air temperature*')


plot(combo_master_ed_met$Correct_NR[combo_master_ed_met$daytime==1] ,combo_master_ed_met$co2_flux[combo_master_ed_met$daytime==1], ylim = c(-10, 10), xlab='Net Radiation', ylab='Co2 Fluxes', main='Co2 Fluxes v.s Net Radiation')


summary(combo_master_ed_met$VPD)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    0.0   436.5   947.7  1236.6  1785.0  5784.0     317 
scatter.smooth(combo_master_ed_met$Correct_NR[combo_master_ed_met$daytime==1],
               combo_master_ed_met$co2_flux[combo_master_ed_met$daytime==1],
               ylim = c(-10, 10),
               cex=0.6,col="grey",
               xlab=expression(Daytime~Net~Radiation~'('~W~m^{-2}~')'), 
               ylab="", 
               main='',las=1,
               lpars=list(lwd=3,col="red"))
mtext(side=2,expression(CO[2]~Flux~'('~mu~mol~m^{-2}~s^{-1}~')'),line=2.5)


scatter.smooth(combo_master_ed_met$air_temperature[combo_master_ed_met$daytime==0&
                                                     combo_master_ed_met$u.>=0.15]-273.15,
               combo_master_ed_met$co2_flux[combo_master_ed_met$daytime==0&
                                                     combo_master_ed_met$u.>=0.15],
               ylim = c(-5, 10),
               cex=0.6,col="grey",
               xlab=expression(Air~Temperature~'('~degree~C~')'), 
               ylab="", 
               main='',las=1,
               lpars=list(lwd=3,col="red"))
mtext(side=2,expression(CO[2]~Flux~'('~mu~mol~m^{-2}~s^{-1}~')'),line=2.5)

#cumulative

LS0tDQp0aXRsZTogJ01ldF9NYXN0ZXIgTWVyZ2Ugd2l0aCBFZGR5X1Byb19NYXN0ZXI6IERhdGEgZnJvbSAyMDE5LTExLTE4Jw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnNvdXJjZSgiY2FsY19mb290cHJpbnRfRkZQLlIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShtb2RlbHIpDQpvcHRpb25zKG5hLmFjdGlvbiA9IG5hLndhcm4pDQpgYGANCg0KDQojIExpc3RzICMNCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0KYGBgDQoNCiMgRGVmaW5pbmcgdGhlIGRhdGEgSS9PIGRpcmVjdG9yeSBmb3IgdGhlIEVkZHkgTWFzdGVyIEZpbGUgIw0KKioNCmBgYHtyfQ0KcGF0aF9lZGR5PC0iQzpcXFVzZXJzXFxUb21teVxcZmx1eFxcRGF0YS1leHBsb3JpbmdcXDAyX0NvbmNvcmRcXCINCnBhdGguaW5fZWRkeTwtcGFzdGUocGF0aF9lZGR5LCIwMV9Qcm9jY2Vzc2VkX0RhdGEiLHNlcD0iIikNCnBhdGgub3V0X2VkZHk8LXBhc3RlKHBhdGhfZWRkeSwiMDNfY29tYmluZWRfZGF0YSIsc2VwPSIiKQ0KdmVyPC0iTWFzdGVyX0VkZHkiIA0KZmlsZS5uYW1lX2VkZHk8LXBhc3RlKCJtYXN0ZXJfZWRkeV9wcm9fY29uY29yZCIsc2VwPSIiKQ0KYGBgDQoNCiMgcmVhZCBpbiBlZGR5cHJvIGZ1bGwgb3V0cHV0IE1hc3RlciBmaWxlLCBwYXJzZSB2YXJpYWJsZSBuYW1lcyAjDQpgYGB7cn0NCmRhdGFfbWFzdGVyX2VkZHk8LXJlYWQuY3N2KHBhc3RlKHBhdGguaW5fZWRkeSwiXFwiLHZlciwiXFwiLGZpbGUubmFtZV9lZGR5LCIuY3N2IixzZXA9IiIpLA0KICAgICAgICAgICAgICAgICAgaGVhZGVyPUYsDQogICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICBuYS5zdHJpbmdzPWMoLTk5OTkpLA0KICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYpDQpjb2xuYW1lcyhkYXRhX21hc3Rlcl9lZGR5KTwtY29sbmFtZXMoDQogIHJlYWQuY3N2KHBhc3RlKHBhdGguaW5fZWRkeSwiXFwiLHZlciwiXFwiLGZpbGUubmFtZV9lZGR5LCIuY3N2IixzZXA9IiIpLA0KICAgICAgICAgICBoZWFkZXI9VCwNCiAgICAgICAgICAgc2tpcD0xKSkNCg0KZGF0YV9tYXN0ZXJfZWRkeQ0KYGBgDQoNCg0KIyBEZWZpbmluZyB0aGUgZGF0YSBJL08gZGlyZWN0b3J5IGZvciB0aGUgTWFzdGVyIG1ldF9kYXRhICMNCg0KYGBge3J9DQpwYXRoX21ldDwtIkM6XFxVc2Vyc1xcVG9tbXlcXGZsdXhcXERhdGEtZXhwbG9yaW5nXFwwMl9Db25jb3JkXFwiDQpwYXRoLmluX21ldDwtcGFzdGUocGF0aF9tZXQsIjAxX1Byb2NjZXNzZWRfRGF0YSIsc2VwPSIiKQ0KcGF0aC5vdXRfbWV0PC1wYXN0ZShwYXRoX21ldCwiMDNfY29tYmluZWRfZGF0YSIsc2VwPSIiKQ0KdmVyPC0ibWV0X2RhdGEiIA0KZmlsZS5uYW1lPC1wYXN0ZSgiTUVUX2RhdGFfbWFzdGVyIixzZXA9IiIpDQpgYGANCg0KDQoNCg0KI3JlYWQgaW4gTWV0X0RhdGEgTWFzdGVyIGZpbGUsIHBhcnNlIHZhcmlhYmxlIG5hbWVzIGFuZCBkZWZpbmUgTi9BcyMNCg0KDQpgYGB7cn0NCm1ldF9kYXRhX21hc3RlcjwtcmVhZC5jc3YocGFzdGUocGF0aC5pbl9tZXQsIlxcIix2ZXIsIlxcIixmaWxlLm5hbWUsIi5jc3YiLHNlcD0iIiksDQogICAgICAgICAgICAgICAgICBoZWFkZXI9RiwNCiAgICAgICAgICAgICAgICAgIHNraXA9NCwNCiAgICAgICAgICAgICAgICAgIG5hLnN0cmluZ3M9YygiTkFOIiksDQogICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRikNCmNvbG5hbWVzKG1ldF9kYXRhX21hc3Rlcik8LWNvbG5hbWVzKA0KICByZWFkLmNzdihwYXN0ZShwYXRoLmluX21ldCwiXFwiLHZlciwiXFwiLGZpbGUubmFtZSwiLmNzdiIsc2VwPSIiKSwNCiAgICAgICAgICAgaGVhZGVyPVQsDQogICAgICAgICAgIHNraXA9IDEpKQ0KDQptZXRfZGF0YV9tYXN0ZXINCg0KYGBgDQoNCg0KDQoNCiMgUGFyc2luZyB0aGUgdGltZSBzdGFtcCBjb252ZXJ0aW5nIGl0IGludG8gYSBQT1NJWGx0IHZlY3RvciMNCg0KKippbnRlcnByZXRpbmcgZGF0ZSBhbmQgdGltZSBpbnRvIG5ldyB0aW1lc3RhbXAgY29sdW1uKioNCg0KKipUaGVuIHRha2luZyB0aGF0IHRpbWUgc3RhbXAgY29sdW1uIGFuZCB0dXJuaW5nIGVhY2ggdGltZSBpbnRvIGEgdW5pcXVlIG51bWJlciAodGltZS5pZCkgc28gSSBjYW4gam9pbiBiYXNlZCBvbiB0aGF0LiBBcyBpdCBjYW4gYmUgcmVhbGx5IHRyaWNreSB0byBqb2luL21lcmdlIGJhc2VkIG9uIHRpbWUgc3RhbXBzIGFsb25lKioNCg0KKipPciBJIGNvdWxkIG1ha2Ugc3VyZSBib3RoIHRpbWUgc3RhbXBzIGFyZSBjaGFyYWN0ZXJzIGFuZCBtYXRjaCB0aGVtIHRoYXQgd2F5KioNCg0KKipGaW5hbGx5IHBsb3RpbmcgdGltZS5pZCB0byBtYWtlIHN1cmUgbXkgdGltZXMgdHJhbnNsYXRlIGxpbmVhcmlseSoqDQoNCmBgYHtyfQ0KZGF0YV9tYXN0ZXJfZWRkeSRUSU1FU1RBTVA8LXN0cnB0aW1lKHBhc3RlKGRhdGFfbWFzdGVyX2VkZHkkZGF0ZSxkYXRhX21hc3Rlcl9lZGR5JHRpbWUsc2VwPSIgIiksZm9ybWF0PSIlbS8lZC8lWSAlSDolTSIsIHR6ID0gIkdNVCIpDQoNCmRhdGFfbWFzdGVyX2VkZHkkdGltZS5pZDwtZGF0YV9tYXN0ZXJfZWRkeSRUSU1FU1RBTVAkeWVhcisxOTAwKyhkYXRhX21hc3Rlcl9lZGR5JFRJTUVTVEFNUCR5ZGF5KS8zNjYrKGRhdGFfbWFzdGVyX2VkZHkkVElNRVNUQU1QJGhvdXIpLzM2Ni8yNCsgKGRhdGFfbWFzdGVyX2VkZHkkVElNRVNUQU1QJG1pbikvMzY2LzI0LzYwDQoNCmRhdGFfbWFzdGVyX2VkZHkkdGltZS5pZFsxOjUwXQ0KcGxvdChkYXRhX21hc3Rlcl9lZGR5JHRpbWUuaWQpDQp3aGljaChkdXBsaWNhdGVkKGRhdGFfbWFzdGVyX2VkZHkkdGltZS5pZCkpDQpgYGANCg0KDQojVGFraW5nIHRoZSBtZXRfZGF0YSBhbmQgdHVybmluZyB0aGUgdGltZSBzdGFtcCBpbnRvIHBvc2l4dCBmb3JtYXQjDQoNCmBgYHtyfQ0KbWV0X2RhdGFfbWFzdGVyJFRJTUVTVEFNUDwtc3RycHRpbWUobWV0X2RhdGFfbWFzdGVyJFRJTUVTVEFNUCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IiVtLyVkLyVZICVIOiVNIiwgdHogPSAiR01UIikNCg0KbWV0X2RhdGFfbWFzdGVyJFRJTUVTVEFNUFsxOjIwXQ0KYGBgDQoNCiNNYWtpbmcgc3VyZSB0aW1lc3RhbXAgY29sdW1ucyBsaW5lIHVwIw0KDQpgYGB7cn0NCg0KbWV0X2RhdGFfbWFzdGVyJFRJTUVTVEFNUFsxOjEwXQ0KDQpkYXRhX21hc3Rlcl9lZGR5JFRJTUVTVEFNUFsxOjEwXQ0KYGBgDQoNCg0KYGBge3J9DQptZXRfZGF0YV9tYXN0ZXINCmBgYA0KDQojY3JlYXRpbmcgYSB0aW1lIGlkIGZvciB0aGUgTUVUIERhdGEgc28gSSBJIGNhbiBqb2luIHRoZSBNRVQgYW5kIEVkZHkgUHJvIERhdGEjDQoNCmBgYHtyfQ0KDQptZXRfZGF0YV9tYXN0ZXIkdGltZS5pZCA8LW1ldF9kYXRhX21hc3RlciRUSU1FU1RBTVAkeWVhcisxOTAwKyhtZXRfZGF0YV9tYXN0ZXIkVElNRVNUQU1QJHlkYXkpLzM2NisobWV0X2RhdGFfbWFzdGVyJFRJTUVTVEFNUCRob3VyKS8zNjYvMjQgKyAobWV0X2RhdGFfbWFzdGVyJFRJTUVTVEFNUCRtaW4pLzM2Ni8yNC82MCANCg0KbWV0X2RhdGFfbWFzdGVyJHRpbWUuaWRbMToyMF0NCnBsb3QobWV0X2RhdGFfbWFzdGVyJHRpbWUuaWQpDQp3aGljaChkdXBsaWNhdGVkKG1ldF9kYXRhX21hc3RlciR0aW1lLmlkKSkNCg0KbWV0X2RhdGFfbWFzdGVyDQpgYGANCg0KDQojSm9pbmluZyB0aGUgTWV0X0RhdGEgYW5kIEVkZHkgUHJvIERhdGEgU2V0cyMNCg0KKip3aXRoIG1lcmdlKioNCg0KYGBge3J9DQoNCmNvbWJvX21hc3Rlcl9lZF9tZXQ8LSBtZXJnZShtZXRfZGF0YV9tYXN0ZXJbLC13aGljaChjb2xuYW1lcyhtZXRfZGF0YV9tYXN0ZXIpPT0iVElNRVNUQU1QIildLCBkYXRhX21hc3Rlcl9lZGR5Wywtd2hpY2goY29sbmFtZXMoZGF0YV9tYXN0ZXJfZWRkeSk9PSJUSU1FU1RBTVAiKV0sIGJ5ID0gInRpbWUuaWQiKQ0KDQpjb21ib19tYXN0ZXJfZWRfbWV0DQoNCmNvbG5hbWVzKGNvbWJvX21hc3Rlcl9lZF9tZXQpDQoNCmBgYA0KDQoNCiNBZGQgYmFjayB0aW1lIHN0YW1wIHRvIHRoZSBjb21ib19tYXN0ZXJfZWRfbWV0Iw0KYGBge3J9DQpjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUDwtc3RycHRpbWUocGFzdGUoY29tYm9fbWFzdGVyX2VkX21ldCRkYXRlLGNvbWJvX21hc3Rlcl9lZF9tZXQkdGltZSxzZXA9IiAiKSxmb3JtYXQ9IiVtLyVkLyVZICVIOiVNIiwgdHogPSAiR01UIikNCg0KY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVBbMToxMF0NCg0KY29tYm9fbWFzdGVyX2VkX21ldA0KDQoNCg0KYGBgDQoNCiNDcmVhdGluZyBhIENTViBGaWxlIG9mIG15IGNvbWJpbmUgTWFzdGVyIEZpbGUhIw0KYGBge3J9DQp3cml0ZS5jc3YoY29tYm9fbWFzdGVyX2VkX21ldCwNCiAgICAgICAgICBwYXN0ZShwYXRoLm91dF9lZGR5LHZlciwiY29tYm9fbWFzdGVyX2VkX21ldCIsc2VwPSIiKSwNCiAgICAgICAgICBxdW90ZSA9IFQsDQogICAgICAgICAgcm93Lm5hbWVzID0gRikNCmBgYA0KDQojZmlsdGVyaW5nIGRhdGEgZm9yIHF1YWxpdHkgY29udHJvbCBmaWx0ZXJzIw0KKipmaWx0ZXJpbmcgbGF0ZW50IGhlYXQsIHNlbnNpYmxlIGhlYXQsIGNvMiBmbHV4LCBxY190YXUgYW5kIGgyMGZsdXggYnkgcXVhbGl0eSBjb250cm9scyoqDQoNCmBgYHtyfQ0KY29tYm9fbWFzdGVyX2VkX21ldCRMRS5bIWlzLm5hKGNvbWJvX21hc3Rlcl9lZF9tZXQkcWNfTEUpJmNvbWJvX21hc3Rlcl9lZF9tZXQkcWNfTEU9PTJdPC1OQQ0KDQpjb21ib19tYXN0ZXJfZWRfbWV0JHFxY19oMm9fZmx1eFshaXMubmEoY29tYm9fbWFzdGVyX2VkX21ldCRxY19oMm9fZmx1eCkmY29tYm9fbWFzdGVyX2VkX21ldCRxY19oMm9fZmx1eD09Ml08LU5BDQoNCmNvbWJvX21hc3Rlcl9lZF9tZXQkSFshaXMubmEoY29tYm9fbWFzdGVyX2VkX21ldCRxY19IKSZjb21ib19tYXN0ZXJfZWRfbWV0JHFjX0g9PTJdPC1OQQ0KDQpjb21ib19tYXN0ZXJfZWRfbWV0JHUuWyFpcy5uYShjb21ib19tYXN0ZXJfZWRfbWV0JHFjX1RhdSkmY29tYm9fbWFzdGVyX2VkX21ldCRxY19UYXU9PTJdPC1OQQ0KDQpjb21ib19tYXN0ZXJfZWRfbWV0JGNvMl9mbHV4WyFpcy5uYShjb21ib19tYXN0ZXJfZWRfbWV0JGNvMl9mbHV4KSZjb21ib19tYXN0ZXJfZWRfbWV0JGNvMl9mbHV4PT0yXTwtTkENCg0KDQpgYGANCg0KIyBsYXRlbnQgaGVhdCwgc2Vuc2libGUgaGVhdCwgaDIwX2ZsdXgsIGFuZCByZWxhdGl2ZSBodW1pZGl0eSBieSBkYXkgZm9yIHdob2xlIHBlcmlvZCAjDQoNCg0KYGBge3J9DQoNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkTEUpDQpoaXN0KGNvbWJvX21hc3Rlcl9lZF9tZXQkTEUpDQoNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkaDJvX2ZsdXgpDQoNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkSCkNCg0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRSSCkNCg0KDQoNCg0KDQpgYGANCg0KDQoNCiNIYWxmIEhvdXIgRmx1eCBBdmVyYWdlcw0KDQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkY28yX2ZsdXgseGxhYj0nVGltZScsIHlsYWI9J0NvMiBGbHV4ZXMnLCBtYWluPScgSGFsZiBIb3VyIENvMiBGbHV4IEF2ZXJhZ2VzJywgIHlsaW0gPSBjKC0yMCwyMCkscGNoPTEsY29sPSJibHVlIixjZXg9MC40KQ0KYGBgDQoNCiNEYWlseSBhdmVyYWdlIG9mIGZsdXhlcyANCmBgYHtyfQ0KDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JGNvMl9mbHV4ICxyb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksZnVuY3Rpb24oeCkgbWVhbih4LG5hLnJtPVQpKSwgeGxhYj0nVGltZScsIHlsYWI9J0NvMiBGbHV4ZXMnLCBtYWluPSdEYWlseSBDbzIgRmx1eCBBdmVyYWdlcycscGNoPTEsY29sPSJyZWQiLGNleD0xLjUpDQoNCmBgYA0KDQojUGxvdHRpbmcgQ28yIGZsdXggYnkgdGltc3RhbXAgb24geC1heGlzLiBGaXJzdCBoYWxmLWhvdXJseSBkYXRhIGFuZCBkYWlseSBkYXRhIHN0YWNrZWQgDQoNCmBgYHtyfQ0KbGF5b3V0KG1hdHJpeChjKDEsMSwyLDIpLCAyLCAyLCBieXJvdyA9IFRSVUUpKQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRjbzJfZmx1eCwgeGxhYj0nVGltZScsIHlsYWI9J0NvMiBGbHV4ZXMnLCBtYWluPSdIYWxmIEhvdXIgRmx1eCBBdmVyYWdlcycsICB5bGltID0gYygtMTUsMTUpLHBjaD0xLGNvbD0iYmx1ZSIsY2V4PTAuNCkNCnBsb3QodGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkY28yX2ZsdXggLHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSxmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpLCB4bGFiPSdUaW1lJywgeWxhYj0nQ28yIEZsdXhlcycsIG1haW49J0RhaWx5IENvMiBGbHV4IEF2ZXJhZ2VzJyxwY2g9MSxjb2w9InJlZCIsY2V4PTEuNSkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCg0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRjbzJfZmx1eCwNCiAgeWxpbSA9IGMoLTEwLCAxMCksDQogICAgICAgICAgICAgICBjZXg9MC42LGNvbD0iZ3JleSIsDQogICAgICAgICAgICAgICB4bGFiPSAnVGltZScsIA0KICAgICAgICAgICAgICAgeWxhYj0iIiwgDQogICAgICAgICAgICAgICBtYWluPScnLGxhcz0xLA0KICAgICAgICAgICAgICAgbHBhcnM9bGlzdChsd2Q9Myxjb2w9InJlZCIpKQ0KbXRleHQoc2lkZT0yLGV4cHJlc3Npb24oQ09bMl1+Rmx1eH4nKCd+bXV+bW9sfm1eey0yfX5zXnstMX1+JyknKSxsaW5lPTIuNSkNCnBhcihuZXc9IFRSVUUpDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JGNvMl9mbHV4ICxyb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksZnVuY3Rpb24oeCkgbWVhbih4LG5hLnJtPVQpKSwNCiAgICAgeGF4dD0nbicsIA0KICAgICB4bGFiPSdUaW1lJywgDQogICAgIHlsYWI9JycsIA0KICAgICBtYWluPScnLCBsYXMgPTEsDQogICAgIHlsaW0gPSBjKC0xMCwxMCksDQogICAgIGx0eT0xLGNvbD0icmVkIiwNCiAgICAgbHdkPTIsdHlwZT0ibCIpDQptdGV4dChzaWRlPTIsZXhwcmVzc2lvbihDT1syXX5GbHV4ficoJ35tdX5tb2x+bV57LTJ9fnNeey0xfX4nKScpLGxpbmU9Mi41KQ0KYWJsaW5lKGg9MCxjb2w9ImJsYWNrIikNCg0KYGBgDQoNCg0KI1Bsb3R0aW5nIGRhaWx5IGZsdXggYXZlcmFnZSBvdmVyIGhhbGYgaG91ciBmbHV4ZXMNCmBgYHtyfQ0KDQoNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkY28yX2ZsdXgsIA0KICAgICB4bGFiPSdUaW1lJywgDQogICAgIHlsYWI9J0NvMiBGbHV4ZXMnLCANCiAgICAgbWFpbj0nJywgIHlsaW0gPSBjKC0xMCwxMCkscGNoPTEsY29sPSJncmV5IixjZXg9MC40KQ0KcGFyKG5ldz0gVFJVRSkNCnBsb3QodGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkY28yX2ZsdXggLHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSxmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpLHhheHQ9J24nLCB4bGFiPSdUaW1lJywgeWxhYj0nQ28yIEZsdXhlcycsIG1haW49JycseWxpbSA9IGMoLTEwLDEwKSxsdHk9MSxjb2w9InJlZCIsbHdkPTIsdHlwZT0ibCIpDQphYmxpbmUoaD0wLGNvbD0iYmxhY2siKQ0KbGVnZW5kKHg9J2JvdHRvbXJpZ2h0JyxsZWdlbmQ9YygnMS8yIGhvdXIgZmx1eGVzJywgJ2RhaWx5IGZsdXggYXZlcmFnZXMnKSwNCmNvbD1jKCdncmV5JywgJ3JlZCcpLCBwY2g9YygxLDE5KSkNCg0KYGBgDQoNCiNEYWlseSBhdmVyYWdlIG9mIFNlbnNpYmxlIEhlYXQgIA0KYGBge3J9DQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JEgscm91bmQoY29tYm9fbWFzdGVyX2VkX21ldCRET1kpLGZ1bmN0aW9uKHgpIG1lYW4oeCxuYS5ybT1UKSkseGxhYj0nVGltZScsIHlsYWI9J1NlbnNpYmxlIEhlYXQnLCBtYWluPSdEYWlseSBBdmVyYWdlIG9mIFNlbnNpYmxlIEhlYXQnKQ0KYGBgDQoNCg0KI0RhaWx5IGF2ZXJhZ2Ugb2YgTGF0ZW50IEhlYXQgIA0KYGBge3J9DQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JExFICxyb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksZnVuY3Rpb24oeCkgbWVhbih4LG5hLnJtPVQpKSx4bGFiPSdUaW1lJywgeWxhYj0nTGF0ZW50IEhlYXQnLCBtYWluPSdEYWlseSBBdmVyYWdlIG9mIExhdGVudCBIZWF0JykNCmBgYA0KDQoNCg0KI2xpbmUgcGxvdCBvZiBjMDJfZmx1eGVzIw0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGNvbWJvX21hc3Rlcl9lZF9tZXQpICsgDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLmlkICwgeSA9IGNvMl9mbHV4KSkgDQoNCmBgYA0KDQoNCiNsYXRlbnQgaGVhdCBhbmQgU2Vuc2libGUgaGVhdCBwbG90dGVkIG92ZXIgZWFjaG90aGVyDQoNCmBgYHtyfQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRMRSwNCiAgICAgeGxhYj0nVGltZScsIA0KICAgICB5bGFiPSdMYXRlbnQgYW5kIFNlbnNpYmxlIEhlYXQnLCANCiAgICAgbWFpbj0nTGF0ZW50IGFuZCBTZW5zaWJsZSBIZWF0JyxwY2g9MSxjb2w9ImJsdWUiLGNleD0wLjYpDQpwb2ludHMoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkSCwNCiAgICAgICBjb2w9InJlZCIsDQogICAgICAgcGNoPTEsDQogICAgICAgY2V4PTAuNikNCmxlZ2VuZCh4PSdib3R0b21yaWdodCcsbGVnZW5kPWMoJ0xhdGVudCBIZWF0JywgJ1NlbnNpYmxlIEhlYXQnKSwNCmNvbD1jKCdibHVlJywgJ3JlZCcpLCBwY2g9YygxLDE5KSkNCg0KYGBgDQoNCiNhaXIgdGVtcGVyYXR1ZSBieSBzZW5zaWJsZSBoZWF0IGFuIFUqIGJ5IGNvMiBmbHV4DQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRhaXJfdGVtcGVyYXR1cmUtMjczLjE1LGNvbWJvX21hc3Rlcl9lZF9tZXQkSCx4bGltPWMoMTAsNDApLHlsaW09YygtMTAwLDUwMCkpDQoNCg0KDQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkdS4gLGNvbWJvX21hc3Rlcl9lZF9tZXQkY28yX2ZsdXgsIHlsaW0gPSBjKDAsIDEwKSwgeGxpbSA9IGMoMCwxKSkNCmBgYA0KDQoNCiNBZGRpbmcgYmVzdCBmaXQgbGluZSB0byBhaXIgdGVtcGVyYXR1cmUgYnkgc2Vuc2libGUgaGVhdA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGNvbWJvX21hc3Rlcl9lZF9tZXQpICsgDQogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gYWlyX3RlbXBlcmF0dXJlLTI3My4xNSwgeSA9IEgpKSArDQogIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IGFpcl90ZW1wZXJhdHVyZS0yNzMuMTUsIHkgPSBIKSkNCg0KDQpgYGANCg0KI2Jlc3QgZml0IGxpbmUgdG8gVSogYnQgY28yIGZsdXgNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBjb21ib19tYXN0ZXJfZWRfbWV0KSArIA0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IHUuLCB5ID0gY28yX2ZsdXgpKSArDQogIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IHUuLCB5ID0gY28yX2ZsdXgpKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpoaXN0KGNvbWJvX21hc3Rlcl9lZF9tZXQkd2luZF9kaXIsIHhsaW0gPSBjKDAsMzcwKSwgYnJlYWtzID0gMzYsIG1haW4gPSAiV2luZCBEaXJlY3Rpb24gYXQgQ29uY29yZCBUb3dlciIsIHhsYWIgPSAnRGVncmVlcycpDQpgYGANCg0KI0NvbXBhcmluZyBNRVQgVGVtcGVyYXR1cmUgZGF0YSB0byB0ZW1wZXJhdHVyZSByZWFkaW5nIGZyb20gTGljb3IgaW50cnVtZW50cyMNCmBgYHtyfQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRQVGVtcF9DX0F2ZykNCnBvaW50cyhjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCxjb21ib19tYXN0ZXJfZWRfbWV0JGFpcl90ZW1wZXJhdHVyZS0yNzMuMTUsY29sPSJyZWQiLHBjaD0yKQ0KYGBgDQoNCg0KDQojQWRkaW5nIGNvZWZmaWNpZW50IHRvIE5ldCByYWRpYXRpb24jDQpgYGB7cn0NCmNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUiA9IChjb21ib19tYXN0ZXJfZWRfbWV0JE5SX1dtMl9BdmcqMTApLzE0LjINCmBgYA0KDQojcGxvdHRpbmcgYWlyIHRlbXBlcmF0dXJlIGZyb20gZGF0YSBsb2dnZXIuIHNlZSB3aGVyZSBvdXIgZ2FwcyBsaW5lIHVwLiBsaW5lcyB1cCB3aXRoIG5ldCByYWRpYXRpb24gYW5kIGdhcHMNCmBgYHtyfQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JEFpclRfQXZnKQ0KYGBgDQoNCiNwbG90dGluZyBOZXQgUmFkYXRpb24gdG8gc2VlIHRoZSBiYWQgZGF0YS4gDQpgYGB7cn0NCnN1bW1hcnkoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X05SW2MoMTo2MDAsMjUwMDo0MDAwKV0pDQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUikNCmBgYA0KDQoNCiNmaWx0ZXJpbmcgb3V0IGJhZCBOUiBudW1iZXJzDQoNCmBgYHtyfQ0KDQpjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3RfTlJbIWlzLm5hKGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUikmKGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUjwoLTE1MCl8Y29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X05SPjgwMCldPC1OQQ0Kc3VtbWFyeShjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3RfTlIpDQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUikNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X05SKQ0KYGBgDQoNCg0KI0FkZGluZyBjb2VmZmljaWVudCB0byBTb2lsIEhlYXQgRmx1eCBEYXRhDQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRTSEZfMV9tVl9BdmcseWxpbT1jKC0xMCwxMCkpDQpjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3Rfc2hmID0gKGNvbWJvX21hc3Rlcl9lZF9tZXQkU0hGXzFfbVZfQXZnKjE2LjQ1NSkNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X3NoZix5bGltPWMoLTUwLDUwKSkNCmBgYA0KDQojcGxvdHRpbmcgU29pbCBoZWF0IGZsdXggdG8gc2VlIHRoZSBiYWQgZGF0YS4gDQpgYGB7cn0NCg0Kc3VtbWFyeShjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3Rfc2hmKQ0KDQpzdW1tYXJ5KGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9zaGZbYygyNTAwOjQwMDApXSkNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X3NoZikNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X3NoZltjKDI1MDA6NDAwMCldLCB5bGltID0gYygtNTAsNTApLHhsYWI9JzgvMTQvMjAxOSB0byA5LzIwLzIwMTknLCB5bGFiPSdTb2lsIEhlYXQgRmx1eCAnLCBtYWluPSdIYWxmIEhvdXIgQXZlcmFnZXMgb2YgU29pbCBIZWF0IEZsdXggb2YgdGhlIENvbmNvcmQgU2l0ZScpDQoNCmBgYA0KDQoNCg0KI2ZpbHRlcmluZyBvdXQgYmFkIHNvaWwgaGVhdCBmbHV4IG51bWJlcnMNCg0KYGBge3J9DQoNCmNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9zaGZbIWlzLm5hKGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9zaGYpJihjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3Rfc2hmPCgtMjApfGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9zaGY+NTApXTwtTkENCnN1bW1hcnkoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X3NoZikNCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X3NoZikNCmBgYA0KDQoqKkVuZXJneSBCYWxhbmNlIG9mIG5vbi1nYXBmaWxsZWQgZGF0YS4gU2xvcGUgb2YgbGluZSBpcyBlbmVyZ3kgYmFsYW5jZSBjbG9zdXJlLiBJZGVhbGx5IGl0IHNob3VsZCBiZSAxOjEgTmV0IHJhZGlhdGlvbiAtIHNvaWwgaGVhdCBmbHV4PSB0byBMYXRlbnQgaGVhdCArc2Vuc2libGUgaGVhdC4gKioNCg0KYGBge3J9DQoNCg0KY29tYm9fbWFzdGVyX2VkX21ldCRFX25nID0gKGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUi1jb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3Rfc2hmKQ0KDQpzdW1tYXJ5KGNvbWJvX21hc3Rlcl9lZF9tZXQkRV9uZyApDQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkRV9uZykNCg0KY29tYm9fbWFzdGVyX2VkX21ldCRFX2xlX2FuZF9IID0oY29tYm9fbWFzdGVyX2VkX21ldCRMRStjb21ib19tYXN0ZXJfZWRfbWV0JEgpDQpzdW1tYXJ5KGNvbWJvX21hc3Rlcl9lZF9tZXQkRV9sZV9hbmRfSCAgKQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JEVfbGVfYW5kX0ggKQ0KDQpzY2F0dGVyLnNtb290aChjb21ib19tYXN0ZXJfZWRfbWV0JEVfbmcsIGNvbWJvX21hc3Rlcl9lZF9tZXQkRV9sZV9hbmRfSCApDQpsbShjb21ib19tYXN0ZXJfZWRfbWV0JEVfbGVfYW5kX0ggIH4gY29tYm9fbWFzdGVyX2VkX21ldCRFX25nKQ0Kc3VtbWFyeShsbShjb21ib19tYXN0ZXJfZWRfbWV0JEVfbGVfYW5kX0ggIH4gY29tYm9fbWFzdGVyX2VkX21ldCRFX25nLTEpKQ0KYGBgDQoNCg0KDQojMS8yIGhvdXIgYW5kIGRhaWx5IGF2ZXJhZ2VzIG9mIExhdGVudCBIZWF0DQoNCg0KDQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkTEUsIA0KICAgICB4bGFiPSdUaW1lJywgDQogICAgIHlsYWI9IGV4cHJlc3Npb24oTGF0ZW50fkhlYXR+Jygnfld+bV57LTJ9ficpJyksIA0KICAgICBtYWluPScnLCAgDQogICAgIHlsaW0gPSBjKC00MCwzMDApLA0KICAgICBwY2g9MSwNCiAgICAgY29sPSJncmV5IixjZXg9MC40KQ0KcGFyKG5ldz0gVFJVRSkNCnBsb3QodGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkTEUgLHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSxmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpLA0KICAgICB4YXh0PSduJywgDQogICAgIHhsYWI9J1RpbWUnLCANCiAgICB5bGFiPSBleHByZXNzaW9uKExhdGVudH5IZWF0ficoJ35Xfm1eey0yfX4nKScpLCAgDQogICAgIG1haW49JycsDQogICAgIHlsaW0gPSBjKC00MCwzMDApLGx0eT0xLGNvbD0icmVkIixsd2Q9Mix0eXBlPSJsIikNCmFibGluZShoPTAsY29sPSJibGFjayIpDQpgYGANCg0KDQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkTEUsDQogIHlsaW0gPSBjKC00MCwgMzAwKSwNCiAgICAgICAgICAgICAgIGNleD0wLjQsY29sPSJncmV5IiwNCiAgICAgICAgICAgICAgIHhsYWI9ICdUaW1lJywgDQogICAgICAgICAgICAgICB5bGFiPSIiLCANCiAgICAgICAgICAgICAgIG1haW49JycsbGFzPTEsDQogICAgICAgICAgICAgICBscGFycz1saXN0KGx3ZD0zLGNvbD0icmVkIikpDQptdGV4dChzaWRlPTIsZXhwcmVzc2lvbihMYXRlbnR+SGVhdH4nKCd+V35tXnstMn1+JyknKSxsaW5lPTIuNSkNCnBhcihuZXc9IFRSVUUpDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JExFICxyb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksZnVuY3Rpb24oeCkgbWVhbih4LG5hLnJtPVQpKSwNCiAgICAgeGF4dD0nbicsIA0KICAgICB4bGFiPSdUaW1lJywgDQogICAgIHlsYWI9JycsIA0KICAgICBtYWluPScnLCBsYXMgPTEsDQogICAgIHlsaW0gPSBjKC00MCwzMDApLA0KICAgICBjb2w9InJlZCIscGNoPTEsY2V4PTEuMCkNCm10ZXh0KHNpZGU9MixleHByZXNzaW9uKExhdGVudH5IZWF0ficoJ35Xfm1eey0yfX4nKScpLGxpbmU9Mi41KQ0KYWJsaW5lKGg9MCxjb2w9ImJsYWNrIikNCmxlZ2VuZCh4PSd0b3ByaWdodCcsbGVnZW5kPWMoJzEvMiBob3VyIGF2ZXJhZ2VzJywgJ2RhaWx5IGF2ZXJhZ2VzJyksDQpjb2w9YygnZ3JleScsICdyZWQnKSwgcGNoPWMoMTksMSkpDQpgYGANCg0KDQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkTEUsIA0KICAgICB4bGFiPSdUaW1lJywgDQogICAgIHlsYWI9J0xhdGVudCBIZWF0JywgDQogICAgIG1haW49J0xhdGVudCBIZWF0OiBEYWlseSBhbmQgSGFsZiBIb3VyIEF2ZXJhZ2VzJywgDQogICAgIHlsaW0gPSBjKC00MCwzMDApLHBjaD0xLGNvbD0iZ3JleSIsY2V4PTAuNCkNCnBhcihuZXc9IFRSVUUpDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JExFICxyb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksZnVuY3Rpb24oeCkgbWVhbih4LG5hLnJtPVQpKSx4YXh0PSduJw0KICAgICAsIHhsYWI9J1RpbWUnLA0KICAgICB5bGFiPSdMYXRlbnQgSGVhdCcsIA0KICAgICBtYWluPSdMYXRlbnQgSGVhdDogRGFpbHkgYW5kIEhhbGYgSG91ciBBdmVyYWdlcycsDQogICAgIHlsaW0gPSBjKC00MCwzMDApLA0KICAgICBjb2w9InJlZCIscGNoPTEsY2V4PTEuMCkNCmFibGluZShoPTAsY29sPSJibGFjayIpDQpsZWdlbmQoeD0ndG9wcmlnaHQnLGxlZ2VuZD1jKCcxLzIgaG91ciBhdmVyYWdlcycsICdkYWlseSBhdmVyYWdlcycpLA0KY29sPWMoJ2dyZXknLCAncmVkJyksIHBjaD1jKDEsMSkpDQpgYGANCg0KDQoNCiMxLzIgaG91ciBhbmQgZGFpbHkgYXZlcmFnZXMgb2YgU2Vuc2libGUgSGVhdA0KDQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkSCwgeGxhYj0nVGltZScsIHlsYWI9J1NlbnNpYmxlIEhlYXQnLCBtYWluPSdTZW5zaWJsZSBIZWF0OiBEYWlseSBhbmQgSGFsZiBIb3VyIEF2ZXJhZ2VzJywgIHlsaW0gPSBjKC00MCwzMDApLHBjaD0xLGNvbD0iZ3JleSIsY2V4PTAuNCkNCnBhcihuZXc9IFRSVUUpDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JEggLHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSxmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpLHhheHQ9J24nLCB4bGFiPSdUaW1lJywgeWxhYj0nU2Vuc2libGUgSGVhdCcsIG1haW49J1NlbnNpYmxlIEhlYXQ6IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLHlsaW0gPSBjKC00MCwzMDApLGx0eT0xLGNvbD0icmVkIixsd2Q9Mix0eXBlPSJsIikNCmFibGluZShoPTAsY29sPSJibGFjayIpDQpgYGANCg0KDQpgYGB7cn0NCnBsb3QoY29tYm9fbWFzdGVyX2VkX21ldCRUSU1FU1RBTVAgLGNvbWJvX21hc3Rlcl9lZF9tZXQkSCwgeGxhYj0nVGltZScsIHlsYWI9J1NlbnNpYmxlIEhlYXQnLCBtYWluPSdTZW5zaWJsZSBIZWF0OiBEYWlseSBhbmQgSGFsZiBIb3VyIEF2ZXJhZ2VzJywgIHlsaW0gPSBjKC00MCwzMDApLHBjaD0xLGNvbD0iZ3JleSIsY2V4PTAuNCkNCnBhcihuZXc9IFRSVUUpDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JEggLHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSxmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpLHhheHQ9J24nLCB4bGFiPSdUaW1lJywgeWxhYj0nU2Vuc2libGUgSGVhdCcsIG1haW49J1NlbnNpYmxlIEhlYXQ6IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLHlsaW0gPSBjKC00MCwzMDApLGNvbD0icmVkIixwY2g9MSxjZXg9MS4wKQ0KYWJsaW5lKGg9MCxjb2w9ImJsYWNrIikNCmBgYA0KDQoNCmBgYHtyfQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRILA0KICB5bGltID0gYygtNDAsIDMwMCksDQogICAgICAgICAgICAgICBjZXg9MC40LGNvbD0iZ3JleSIsDQogICAgICAgICAgICAgICB4bGFiPSAnVGltZScsIA0KICAgICAgICAgICAgICAgeWxhYj0iIiwgDQogICAgICAgICAgICAgICBtYWluPScnLGxhcz0xLA0KICAgICAgICAgICAgICAgbHBhcnM9bGlzdChsd2Q9Myxjb2w9InJlZCIpKQ0KbXRleHQoc2lkZT0yLGV4cHJlc3Npb24oU2Vuc2libGV+SGVhdH4nKCd+V35tXnstMn1+JyknKSxsaW5lPTIuNSkNCnBhcihuZXc9IFRSVUUpDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JEggLHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSxmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpLA0KICAgICB4YXh0PSduJywgDQogICAgIHhsYWI9J1RpbWUnLCANCiAgICAgeWxhYj0nJywgDQogICAgIG1haW49JycsIGxhcyA9MSwNCiAgICAgeWxpbSA9IGMoLTQwLDMwMCksDQogICAgIGNvbD0icmVkIixwY2g9MSxjZXg9MS4wKQ0KbXRleHQoc2lkZT0yLGV4cHJlc3Npb24oU2Vuc2libGV+SGVhdH4nKCd+V35tXnstMn1+JyknKSxsaW5lPTIuNSkNCmFibGluZShoPTAsY29sPSJibGFjayIpDQpgYGANCg0KI05ldCBSYWRpYXRpb24gRGFpbHkgYW5kIDEvMiBob3VyIGF2ZXJhZ2VzDQoNCmBgYHtyfQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X05SLCB4bGFiPSdUaW1lJywgeWxhYj0nTmV0IFJhZGlhdGlvbicsIG1haW49J05ldCBSYWRpYXRpb246IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLCAgeWxpbSA9IGMoLTgwLDgwMCkscGNoPTEsY29sPSJncmV5IixjZXg9MC40KQ0KcGFyKG5ldz0gVFJVRSkNCnBsb3QodGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUiAscm91bmQoY29tYm9fbWFzdGVyX2VkX21ldCRET1kpLGZ1bmN0aW9uKHgpIG1lYW4oeCxuYS5ybT1UKSkseGF4dD0nbicsIHhsYWI9J1RpbWUnLCB5bGFiPSdOZXQgUmFkaWF0aW9uJywgbWFpbj0nTmV0IFJhZGlhdGlvbjogRGFpbHkgYW5kIEhhbGYgSG91ciBBdmVyYWdlcycseWxpbSA9IGMoLTgwLDgwMCksbHR5PTEsY29sPSJyZWQiLGx3ZD0yLHR5cGU9ImwiKQ0KYWJsaW5lKGg9MCxjb2w9ImJsYWNrIikNCmBgYA0KDQpgYGB7cn0NCg0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X05SLCB4bGFiPSdUaW1lJywgeWxhYj0nTmV0IFJhZGlhdGlvbicsIG1haW49J05ldCBSYWRpYXRpb246IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLCAgeWxpbSA9IGMoLTgwLDgwMCkscGNoPTEsY29sPSJncmV5IixjZXg9MC40KQ0KcGFyKG5ldz0gVFJVRSkNCnBsb3QodGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUiAscm91bmQoY29tYm9fbWFzdGVyX2VkX21ldCRET1kpLGZ1bmN0aW9uKHgpIG1lYW4oeCxuYS5ybT1UKSkseGF4dD0nbicsIHhsYWI9J1RpbWUnLCB5bGFiPSdOZXQgUmFkaWF0aW9uJywgbWFpbj0nTmV0IFJhZGlhdGlvbjogRGFpbHkgYW5kIEhhbGYgSG91ciBBdmVyYWdlcycseWxpbSA9IGMoLTgwLDgwMCksY29sPSJyZWQiLHBjaD0xLGNleD0xLjApDQphYmxpbmUoaD0wLGNvbD0iYmxhY2siKQ0KDQpgYGANCg0KDQojc29pbCBoZWF0IGZsdXgNCmBgYHtyfQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X3NoZiwgeGxhYj0nVGltZScsIHlsYWI9J1NvaWwgSGVhdCBGbHV4JywgbWFpbj0nU29pbCBIZWF0IEZsdXg6IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLCAgeWxpbSA9IGMoLTIwLDQwKSxwY2g9MSxjb2w9ImdyZXkiLGNleD0wLjQpDQpwYXIobmV3PSBUUlVFKQ0KcGxvdCh0YXBwbHkoY29tYm9fbWFzdGVyX2VkX21ldCRDb3JyZWN0X3NoZixyb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksZnVuY3Rpb24oeCkgbWVhbih4LG5hLnJtPVQpKSx4YXh0PSduJywgeGxhYj0nVGltZScsIHlsYWI9J1NvaWwgSGVhdCBGbHV4JywgbWFpbj0nU29pbCBIZWF0IEZsdXg6IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLHlsaW0gPSBjKC0yMCw0MCksbHR5PTEsY29sPSJyZWQiLGx3ZD0yLHR5cGU9ImwiKQ0KYWJsaW5lKGg9MCxjb2w9ImJsYWNrIikNCmBgYA0KDQoNCg0KYGBge3J9DQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkVElNRVNUQU1QICxjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3Rfc2hmLCB4bGFiPSdUaW1lJywgeWxhYj0nU29pbCBIZWF0IEZsdXgnLCBtYWluPSdTb2lsIEhlYXQgRmx1eDogRGFpbHkgYW5kIEhhbGYgSG91ciBBdmVyYWdlcycsICB5bGltID0gYygtMjAsNDApLHBjaD0xLGNvbD0iZ3JleSIsY2V4PTAuNCkNCnBhcihuZXc9IFRSVUUpDQpwbG90KHRhcHBseShjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3Rfc2hmLHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSxmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpLHhheHQ9J24nLCB4bGFiPSdUaW1lJywgeWxhYj0nU29pbCBIZWF0IEZsdXgnLCBtYWluPSdTb2lsIEhlYXQgRmx1eDogRGFpbHkgYW5kIEhhbGYgSG91ciBBdmVyYWdlcycseWxpbSA9IGMoLTIwLDQwKSxjb2w9InJlZCIscGNoPTEsY2V4PTEuMCkNCmFibGluZShoPTAsY29sPSJibGFjayIpDQpgYGANCg0KI2FpciB0ZW1wZXJhdHVyZSBkYWlseSBhbmQgMS8yIGhvdXIgYXZlcmFnZXMNCmBgYHtyfQ0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFRJTUVTVEFNUCAsY29tYm9fbWFzdGVyX2VkX21ldCRhaXJfdGVtcGVyYXR1cmUtMjczLjE1LCB4bGFiPSdUaW1lJywgeWxhYj0nQWlyIFRlbXBlcmF0dXJlIEM6IERhaWx5IGFuZCAxLzIgSG91ciBBdmVyYWdlcycsIG1haW49JyAnLCAgeWxpbSA9IGMoNSw0MCkscGNoPTEsY29sPSJncmV5IixjZXg9MC40KQ0KcGFyKG5ldz0gVFJVRSkNCnBsb3QodGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkYWlyX3RlbXBlcmF0dXJlLTI3My4xNSxyb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksZnVuY3Rpb24oeCkgbWVhbih4LG5hLnJtPVQpKSx4YXh0PSduJywgeGxhYj0nVGltZScsIHlsYWI9J0FpciBUZW1wZXJhdHVyZSBDOiBEYWlseSBhbmQgMS8yIEhvdXIgQXZlcmFnZXMnLCBtYWluPScnLHlsaW0gPSBjKDUsNDApLGx0eT0xLGNvbD0icmVkIixsd2Q9Mix0eXBlPSJsIikNCmFibGluZShoPTAsY29sPSJibGFjayIpDQpgYGANCg0KDQojV2F0ZXIgRmx1eGVzIGRhaWx5IGFuZCAxLzIgaG91ciBhdmVyYWdlcw0KYGBge3J9DQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkVElNRVNUQU1QICxjb21ib19tYXN0ZXJfZWRfbWV0JGgyb19mbHV4LCB4bGFiPSdUaW1lJywgeWxhYj0nSDJPIEZsdXhlcycsIG1haW49J0gyTyBGbHV4ZXM6IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLCAgeWxpbSA9IGMoLTIsNSkscGNoPTEsY29sPSJncmV5IixjZXg9MC40KQ0KcGFyKG5ldz0gVFJVRSkNCg0KcGxvdCh0YXBwbHkoY29tYm9fbWFzdGVyX2VkX21ldCRoMm9fZmx1eCwNCiAgICAgICAgICAgIHJvdW5kKGNvbWJvX21hc3Rlcl9lZF9tZXQkRE9ZKSwNCiAgICAgICAgICAgIGZ1bmN0aW9uKHgpIG1lYW4oeCxuYS5ybT1UKSksDQogICAgIHhheHQ9J24nLA0KICAgICB4bGFiPSdUaW1lJywNCiAgICAgeWxhYj0nSDJPIEZsdXhlcycsDQogICAgIG1haW49J0gyTyBGbHV4ZXM6IERhaWx5IGFuZCBIYWxmIEhvdXIgQXZlcmFnZXMnLA0KICAgICB5bGltID0gYygtMiw1KSwNCiAgICAgbHR5PTEsDQogICAgIGNvbD0icmVkIiwNCiAgICAgbHdkPTIsDQogICAgIHR5cGU9ImwiKQ0KYWJsaW5lKGg9MCxjb2w9ImJsYWNrIikNCg0KcGxvdChjdW1zdW0odGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkaDJvX2ZsdXgsDQogICAgICAgICAgICByb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksDQogICAgICAgICAgICBmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpKSoxOC4wMi8xMDAwMDAwKjE4MDAqNDgsDQogICAgIHhheHQ9J24nLA0KICAgICB4bGFiPSdEYXlzIHNpbmNlIEp1bmUgMjUnLA0KICAgICB5bGFiPWV4cHJlc3Npb24oQ3VtdWxhdGl2ZX5FdmFwb3RyYW5zcGlyYXRpb25+Jygnfm1tficpJyksDQogICAgIG1haW49JycsDQogICAgIHlsaW0gPSBjKDAsMTUwKSwNCiAgICAgbHR5PTEsDQogICAgIGNvbD0icmVkIiwNCiAgICAgbHdkPTIsDQogICAgIHR5cGU9ImwiKQ0KYXhpcyhzaWRlPTEsYXQ9c2VxKDAsMTIwLGJ5PTMwKSkNCg0KcGxvdChjdW1zdW0odGFwcGx5KGNvbWJvX21hc3Rlcl9lZF9tZXQkY28yX2ZsdXgsDQogICAgICAgICAgICByb3VuZChjb21ib19tYXN0ZXJfZWRfbWV0JERPWSksDQogICAgICAgICAgICBmdW5jdGlvbih4KSBtZWFuKHgsbmEucm09VCkpKSoxMi8xMDAwMDAwKjE4MDAqNDgsDQogICAgIHhheHQ9J24nLA0KICAgICB4bGFiPSdEYXlzIHNpbmNlIEp1bmUgMjUnLA0KICAgICB5bGFiPWV4cHJlc3Npb24oQ3VtdWxhdGl2ZX5ORUV+Jygnfmd+Q35tXnstMn1+JyknKSwNCiAgICAgbWFpbj0nJywNCiAgICAgeWxpbSA9IGMoLTUwLDEwKSwNCiAgICAgbHR5PTEsDQogICAgIGNvbD0icmVkIiwNCiAgICAgbHdkPTIsDQogICAgIHR5cGU9ImwiKQ0KYXhpcyhzaWRlPTEsYXQ9c2VxKDAsMTIwLGJ5PTMwKSkNCg0KYGBgDQoNCiNDbzIgZmx1eGVzIHYucyB1IHN0YXIsIHRlbXBlcmF0dXJlLCBhbmQgVlBEDQoNCmBgYHtyfQ0KDQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkdS4gLGNvbWJvX21hc3Rlcl9lZF9tZXQkY28yX2ZsdXgsIHlsaW0gPSBjKC01LCAxMCksIHhsaW0gPSBjKDAsMSksIHhsYWI9J1UqJywgeWxhYj0nQ28yIEZsdXhlcycsIG1haW49J0NvMiBGbHV4ZXMgdi5zIFUqJykNCg0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JFZQRCAsY29tYm9fbWFzdGVyX2VkX21ldCRjbzJfZmx1eCwgeWxpbSA9IGMoLTUsIDEwKSwgeGxhYj0nVlBEJywgeWxhYj0nQ28yIEZsdXhlcycsIG1haW49J0NvMiBGbHV4ZXMgdi5zIFZQRConKQ0KDQpwbG90KGNvbWJvX21hc3Rlcl9lZF9tZXQkYWlyX3RlbXBlcmF0dXJlLTI3My4xNSAsY29tYm9fbWFzdGVyX2VkX21ldCRjbzJfZmx1eCwgeWxpbSA9IGMoLTUsIDEwKSwgeGxhYj0nQWlyIFRlbXBlcmF0dXJlIChDKScsIHlsYWI9J0NvMiBGbHV4ZXMnLCBtYWluPSdDbzIgRmx1eGVzIHYucyBBaXIgdGVtcGVyYXR1cmUqJykNCg0KcGxvdChjb21ib19tYXN0ZXJfZWRfbWV0JENvcnJlY3RfTlJbY29tYm9fbWFzdGVyX2VkX21ldCRkYXl0aW1lPT0xXSAsY29tYm9fbWFzdGVyX2VkX21ldCRjbzJfZmx1eFtjb21ib19tYXN0ZXJfZWRfbWV0JGRheXRpbWU9PTFdLCB5bGltID0gYygtMTAsIDEwKSwgeGxhYj0nTmV0IFJhZGlhdGlvbicsIHlsYWI9J0NvMiBGbHV4ZXMnLCBtYWluPSdDbzIgRmx1eGVzIHYucyBOZXQgUmFkaWF0aW9uJykNCg0Kc3VtbWFyeShjb21ib19tYXN0ZXJfZWRfbWV0JFZQRCkNCnNjYXR0ZXIuc21vb3RoKGNvbWJvX21hc3Rlcl9lZF9tZXQkQ29ycmVjdF9OUltjb21ib19tYXN0ZXJfZWRfbWV0JGRheXRpbWU9PTFdLA0KICAgICAgICAgICAgICAgY29tYm9fbWFzdGVyX2VkX21ldCRjbzJfZmx1eFtjb21ib19tYXN0ZXJfZWRfbWV0JGRheXRpbWU9PTFdLA0KICAgICAgICAgICAgICAgeWxpbSA9IGMoLTEwLCAxMCksDQogICAgICAgICAgICAgICBjZXg9MC42LGNvbD0iZ3JleSIsDQogICAgICAgICAgICAgICB4bGFiPWV4cHJlc3Npb24oRGF5dGltZX5OZXR+UmFkaWF0aW9uficoJ35Xfm1eey0yfX4nKScpLCANCiAgICAgICAgICAgICAgIHlsYWI9IiIsIA0KICAgICAgICAgICAgICAgbWFpbj0nJyxsYXM9MSwNCiAgICAgICAgICAgICAgIGxwYXJzPWxpc3QobHdkPTMsY29sPSJyZWQiKSkNCm10ZXh0KHNpZGU9MixleHByZXNzaW9uKENPWzJdfkZsdXh+Jygnfm11fm1vbH5tXnstMn1+c157LTF9ficpJyksbGluZT0yLjUpDQoNCnNjYXR0ZXIuc21vb3RoKGNvbWJvX21hc3Rlcl9lZF9tZXQkYWlyX3RlbXBlcmF0dXJlW2NvbWJvX21hc3Rlcl9lZF9tZXQkZGF5dGltZT09MCYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm9fbWFzdGVyX2VkX21ldCR1Lj49MC4xNV0tMjczLjE1LA0KICAgICAgICAgICAgICAgY29tYm9fbWFzdGVyX2VkX21ldCRjbzJfZmx1eFtjb21ib19tYXN0ZXJfZWRfbWV0JGRheXRpbWU9PTAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvX21hc3Rlcl9lZF9tZXQkdS4+PTAuMTVdLA0KICAgICAgICAgICAgICAgeWxpbSA9IGMoLTUsIDEwKSwNCiAgICAgICAgICAgICAgIGNleD0wLjYsY29sPSJncmV5IiwNCiAgICAgICAgICAgICAgIHhsYWI9ZXhwcmVzc2lvbihBaXJ+VGVtcGVyYXR1cmV+JygnfmRlZ3JlZX5DficpJyksIA0KICAgICAgICAgICAgICAgeWxhYj0iIiwgDQogICAgICAgICAgICAgICBtYWluPScnLGxhcz0xLA0KICAgICAgICAgICAgICAgbHBhcnM9bGlzdChsd2Q9Myxjb2w9InJlZCIpKQ0KbXRleHQoc2lkZT0yLGV4cHJlc3Npb24oQ09bMl1+Rmx1eH4nKCd+bXV+bW9sfm1eey0yfX5zXnstMX1+JyknKSxsaW5lPTIuNSkNCg0KYGBgDQoNCiNjdW11bGF0aXZlIA0K